home *** CD-ROM | disk | FTP | other *** search
/ Windows News 1997 February / Windows News CD #1 - Fev 97.iso / share / winitel / scope._ / scope.
Encoding:
Text File  |  1997-01-22  |  10.6 KB  |  348 lines

  1. /*------------------------------------------------------------------------
  2.    Fichier : Scope.C
  3.    Contenu : Gestion des caractères reçus
  4. --------------------------------------------------------------------------
  5.  
  6. Fonctions :
  7.    TopWndScope           : Traite les messages
  8.    AfficheBufferBin       : Affiche le buffer binaire
  9.    AfficheBufferTexte       : Affiche le buffer texte
  10.    DirectAdvise        : Met en / hors service l'advise direct
  11.    EffaceScope           : Efface les buffers et la fenêtre
  12.    ReceptionDirecteBinaire : Traite les caractères binaires entrant
  13.    ReceptionDirecteTexte   : Traite les caractères textes entrant
  14.    wmCreateScope       : Traite le message WM_CREATE
  15.    wmMdiActivateScope       : Traite le message WM_MDIACTIVATE
  16.    wmSizeListeScope       : Traite le message WM_SIZE
  17.    wmuRefreshScope       : Traite le message de rafriachissement
  18.    OptionsSupervision       : Affiche la boite des options
  19.    DlgProcOptSup       : DlgProc de la boite d'options
  20.  
  21. ------------------------------------------------------------------------*/
  22.  
  23. #include <windows.h>
  24. #include <stdlib.h>
  25. #include <ddeml.h>
  26. #include "testdde.h"
  27. #include "build\testdde.dec"
  28. #include "dialogs.h"
  29.  
  30. #define MAX_ASCII 500
  31. #define MAX_BIN   500
  32.  
  33. //------------------------------------------------------------------------
  34. // Variables globales
  35. //------------------------------------------------------------------------
  36.  
  37. int TypeDisplayScope=0; // 0= Texte 1=Binaire
  38. int MonitorFlow=0; // Bit 0 Texte, Bit 1 Hexa
  39.  
  40. unsigned char BufAscii[MAX_ASCII]; // Tampon pour les caractères ASCII
  41. int NbreAscii; // Nombre de caractère dans le tampon
  42. int EcritureAscii; // Pointeur d'écriture dans le tampon
  43.  
  44. unsigned char BufBin[MAX_BIN]; // Tampon pour les caractères binaire
  45. int NbreBin; // Nombre de caractère dans le tampon
  46. int EcritureBin; // Pointeur d'écriture dans le tampon
  47.  
  48. //------------------------------------------------------------------------
  49. // Création de la fenêtre des alarmes
  50. //------------------------------------------------------------------------
  51.  
  52. void wmCreateScope(HWND hWnd)
  53. {
  54. HFONT hFont;
  55.  
  56. // Mémorise le handle de la fenêtre
  57. hWndScope=hWnd;
  58.  
  59. // Création de la listbox des noms de chassis
  60. CreateWindow("LISTBOX","",
  61.          WS_VISIBLE|WS_VSCROLL|WS_CHILD|
  62.          LBS_DISABLENOSCROLL|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT,
  63.              CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  64.          hWnd,FF_SCOPE,hInst,NULL);
  65.  
  66. // Impose la police au champ d'édition
  67. hFont=GetStockObject(ANSI_FIXED_FONT);
  68. SendDlgItemMessage(hWnd,FF_SCOPE,WM_SETFONT,hFont,0l);
  69.  
  70. // Initialisation
  71. EcritureAscii=0;
  72. NbreAscii=0;
  73. EcritureBin=0;
  74. NbreBin=0;
  75. TypeDisplayScope=0;
  76. }
  77.  
  78. //------------------------------------------------------------------------
  79. // Traitement du message WM_MDIACTIVATE
  80. //------------------------------------------------------------------------
  81.  
  82. void wmMdiActivateScope (HWND hWnd,WPARAM wParam)
  83. {
  84. if (wParam) ChangeMenuMDI(hWnd,MENU_SCOPE,2);
  85. }
  86.  
  87.  
  88. //------------------------------------------------------------------------
  89. // Dimensionement de la fenêtre
  90. //------------------------------------------------------------------------
  91.  
  92. void wmSizeListeScope (HWND hWnd,WPARAM wParam,LPARAM lParam)
  93. {
  94. // Redimensionne la list box
  95. MoveWindow(GetDlgItem(hWnd,FF_SCOPE),0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
  96. }
  97.  
  98.  
  99. //------------------------------------------------------------------------
  100. // Rafraîchissement du contenu de la boite
  101. //------------------------------------------------------------------------
  102.  
  103. void wmuRefreshScope(HWND hWnd)
  104. {
  105. switch (TypeDisplayScope)
  106.     {
  107.     case 0 : AfficheBufferTexte(hWnd);break;
  108.     case 1 : AfficheBufferBin(hWnd);break;
  109.     }
  110. }
  111.  
  112. //------------------------------------------------------------------------
  113. // Fonction de traitement des messages
  114. //------------------------------------------------------------------------
  115.  
  116. long FAR PASCAL TopWndScope(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
  117. {
  118. int r=1;
  119.  
  120. switch (message)
  121.     {
  122.     case WMU_ASYNCBINAIRE : ReceptionDirecteBinaire(wParam);break;
  123.     case WMU_ASYNCTEXTE   : ReceptionDirecteTexte(wParam);break;
  124.     case WMU_BINAIRE      : TypeDisplayScope=1;wmuRefreshScope(hWnd);break;
  125.     case WMU_ASCII      : TypeDisplayScope=0;wmuRefreshScope(hWnd);break;
  126.     case WM_MDIACTIVATE   : wmMdiActivateScope(hWnd,wParam);break;
  127.     case WM_SYSCOMMAND      : return(wmSysCommandChild(hWnd,wParam,lParam));
  128.     case WM_CREATE      : wmCreateScope (hWnd);break;
  129.     case WM_SIZE      : wmSizeListeScope (hWnd,wParam,lParam);break;
  130.     case WMU_REFRESH      : wmuRefreshScope(hWnd);r=1;break;
  131.     }
  132.  
  133. if (r)
  134.     return (DefMDIChildProc(hWnd, message, wParam, lParam));
  135.   else
  136.     return (NULL);
  137. }
  138.  
  139.  
  140. //------------------------------------------------------------------------
  141. // Traitement sur réception d'un caractère texte directement
  142. //------------------------------------------------------------------------
  143.  
  144. void ReceptionDirecteTexte(WPARAM c)
  145. {
  146. // Ecriture des caractères dans le tampon
  147. BufAscii[EcritureAscii]=(char)c;
  148. if (NbreAscii < MAX_ASCII) NbreAscii++; // Plafonne le nombre de caractères
  149. if (EcritureAscii < MAX_ASCII-1) EcritureAscii++; else EcritureAscii=0;
  150. }
  151.  
  152.  
  153. //------------------------------------------------------------------------
  154. // Traitement sur réception d'un caractère Binaire directement
  155. //------------------------------------------------------------------------
  156.  
  157. void ReceptionDirecteBinaire(WPARAM c)
  158. {
  159. // Ecriture des caractères dans le tampon
  160. BufBin[EcritureBin]=(char) c;
  161. if (NbreBin < MAX_BIN) NbreBin++; // Plafonne le nombre de caractères
  162. if (EcritureBin < MAX_BIN-1) EcritureBin++; else EcritureBin=0;
  163. }
  164.  
  165.  
  166. //------------------------------------------------------------------------
  167. // Place le texte dans la list box
  168. //------------------------------------------------------------------------
  169.  
  170. void AfficheBufferTexte(HWND hWnd)
  171. {
  172. int p;
  173. int n,c,j;
  174. char ligne[100];
  175. char car[5];
  176.  
  177. // Détermine le début du buffer
  178. if (NbreAscii<MAX_ASCII) p=0; else p=EcritureAscii;
  179.  
  180. // Vide la liste
  181. SendDlgItemMessage(hWnd,FF_SCOPE,LB_RESETCONTENT,0,0);
  182.  
  183. // Affiche tout les caractères
  184. c=0;
  185. for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0; // Efface la ligne
  186. for (n=0;n<NbreAscii;n++)
  187.     {
  188.     wsprintf(car,"%02X ",BufAscii[p]);
  189.     ligne[c*3]=car[0];ligne[c*3+1]=car[1];
  190.     ligne[c+33]=BufAscii[p];
  191.     c++;
  192.     if (c>9)
  193.     {
  194.     SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
  195.     for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0;
  196.     c=0;
  197.     }
  198.     if (p<MAX_ASCII-1) p++; else p=0;
  199.     }
  200.  
  201. // Affiche une ligne incomplète
  202. if (c)    SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
  203.  
  204. // Lecture du nombre de ligne
  205. c=(int)  SendDlgItemMessage(hWnd,FF_SCOPE,LB_GETCOUNT,0,0);
  206. if (c>0) SendDlgItemMessage(hWnd,FF_SCOPE,LB_SETCURSEL,c-1,0);
  207. }
  208.  
  209. //------------------------------------------------------------------------
  210. // Place le texte dans la list box
  211. //------------------------------------------------------------------------
  212.  
  213. void AfficheBufferBin(HWND hWnd)
  214. {
  215. int p;
  216. int n,c,j;
  217. char ligne[100];
  218. char car[5];
  219.  
  220. // Détermine le début du buffer
  221. if (NbreBin<MAX_BIN) p=0; else p=EcritureBin;
  222.  
  223. // Vide la liste
  224. SendDlgItemMessage(hWnd,FF_SCOPE,LB_RESETCONTENT,0,0);
  225.  
  226. // Affiche tout les caractères
  227. c=0;
  228. for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0; // Efface la ligne
  229. for (n=0;n<NbreBin;n++)
  230.     {
  231.     wsprintf(car,"%02X ",BufBin[p]);
  232.     ligne[c*3]=car[0];ligne[c*3+1]=car[1];
  233.     if ((BufBin[p]>31)&&(BufBin[p]<128))
  234.     ligne[c+33]=BufBin[p];
  235.        else
  236.     ligne[c+33]=(unsigned char)183;
  237.     c++;
  238.     if (c>9)
  239.     {
  240.     SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
  241.     for (j=0;j<43;j++) ligne[j]=' ';ligne[j]=0;
  242.     c=0;
  243.     }
  244.     if (p<MAX_BIN-1) p++; else p=0;
  245.     }
  246.  
  247. // Affiche une éventuelle ligne incomplète
  248. if (c)    SendDlgItemMessage(hWnd,FF_SCOPE,LB_ADDSTRING,0,(LPARAM)(LPCSTR)ligne);
  249.  
  250. // Lecture du nombre de ligne
  251. c=(int)  SendDlgItemMessage(hWnd,FF_SCOPE,LB_GETCOUNT,0,0);
  252. if (c>0) SendDlgItemMessage(hWnd,FF_SCOPE,LB_SETCURSEL,c-1,0);
  253. }
  254.  
  255. //------------------------------------------------------------------------
  256. // Effacement des contenu du scope
  257. //------------------------------------------------------------------------
  258.  
  259. void EffaceScope(void)
  260. {
  261. EcritureAscii=0;
  262. NbreAscii=0;
  263. EcritureBin=0;
  264. NbreBin=0;
  265. wmuRefreshScope(hWndScope);
  266. }
  267.  
  268. //------------------------------------------------------------------------
  269. // Edition des options de supervision
  270. //------------------------------------------------------------------------
  271.  
  272. void OptionsSupervision (HWND hWnd)
  273. {
  274. FARPROC lpProc;
  275. int r;
  276.  
  277. lpProc = MakeProcInstance(DlgProcOptSup, hInst);
  278. r=DialogBox(hInst,MAKEINTRESOURCE(DLGOPTIONSANALYSE),hWnd,lpProc);
  279. FreeProcInstance(lpProc);
  280.  
  281.  
  282. // Traitement des advise directes (sans passer par DDE)
  283.  
  284. // Vérifie s'il faut changer le type d'advise
  285. if ((r!=-1)&&(r!=MonitorFlow) && hConversation)
  286.     {
  287.     DirectAdvise (r);
  288.     }
  289. // Mémorise l'état
  290. MonitorFlow=r;
  291. }
  292.  
  293. //------------------------------------------------------------------------
  294. // DlgProc de la boîte des options de supervision
  295. //------------------------------------------------------------------------
  296.  
  297. BOOL FAR PASCAL DlgProcOptSup(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam)
  298. {
  299. int r;
  300.  
  301.     switch (message)
  302.     {
  303.     case WM_INITDIALOG:
  304.         if (MonitorFlow & MONITOR_BINAIRE) CheckDlgButton(hDlg,ID_BINAIRE,1);
  305.         if (MonitorFlow & MONITOR_TEXTE) CheckDlgButton(hDlg,ID_TEXTE,1);
  306.         return (TRUE);
  307.     case WM_COMMAND:
  308.         switch (wParam)
  309.            {
  310.            case ID_AIDE  : AppelAide(hDlg,7);return TRUE;
  311.            case IDOK     : r=0;
  312.                    if (IsDlgButtonChecked(hDlg,ID_TEXTE)) r|=MONITOR_TEXTE;
  313.                    if (IsDlgButtonChecked(hDlg,ID_BINAIRE)) r|=MONITOR_BINAIRE;
  314.                    EndDialog(hDlg,r);return (TRUE);
  315.            case IDCANCEL : EndDialog(hDlg,-1);return (TRUE);
  316.            }
  317.         break;
  318.     }
  319.     return (FALSE);
  320. }
  321.  
  322. //--------------------------------------------------------------------
  323. // Mise en ou hors / service du "DirectAdvise"
  324. //--------------------------------------------------------------------
  325.  
  326. void DirectAdvise (int r)
  327.     {
  328.     int mt,mb;
  329.     char mes[50];
  330.  
  331.     // Vérifie s'il faut un advise texte
  332.     if (r & MONITOR_TEXTE) mt=WMU_ASYNCTEXTE; else mt=0;
  333.  
  334.     // Vérifie s'il faut un advise binaire
  335.     if (r & MONITOR_BINAIRE) mb=WMU_ASYNCBINAIRE; else mb=0;
  336.  
  337.     // Constitution de la chaine de commande
  338.     wsprintf(mes,"DirectAdvise \"%04X %04X %04X\"",hWndScope,mb,mt);
  339.  
  340.     // Envoi l'ordre à Winitel
  341.     if (!EnvoiCommandeDDE(mes))
  342.      {
  343.      LoadString(hInst,106,mes,sizeof mes);
  344.      MessageBox(hWndMain,mes,NULL,MB_OK|MB_ICONEXCLAMATION);
  345.      r = 0;
  346.      }
  347.     }
  348.